import {CRC} from "./crc";
import store from "@/store/index.js"

/**
 * 读取的指令，一条数据分十二次读
 * @type {string[]}
 */
let readCommands = [
  '02031c8400040383',
  '02031c8400040383',
  '02031c8400040383',
  '02031c8400040383',
  '02031c8400040383',
  '02031c8400040383',
  '02031c8400040383',
  '02031c8400040383',
  '02031c8400040383',
  '02031c8400040383',
  '02031c8400040383',
  '02031c8400040383'
];

/**
 * 从蓝牙设备中获取有多少条记录没有读取的指令
 * @type {string}
 */
let lengthCommand = ''

/**
 * 一共要读多少次才能读取到一条完整的记录
 * @type {number}
 */
let totalCount = readCommands.length;

/**
 * 读到的数据（已经去头去尾了）
 * @type {string}
 */
let recordRaw = '';

/**
 * 判断从蓝牙中获取到的数据是否合法
 * 这个机器里一个地址位占两个字节
 * TODO 这里今后会调整，先只读4个地址位，就是8个字节
 * @param data 从蓝牙中获取到的数据
 * @return boolean false校验失败，true校验成功
 */
let checkDataFromBlueTooth = data => {
  // 如果已经读满了totalCount，就是说已经读到了一条记录，那么如果再调用这个方法的话，返回false
  // TODO 真实环境要放开
  let currentCount = store.state.blueTooth.readIndex;
  if (currentCount >= totalCount) {
    return false;
  }
  // 去掉所有的空格
  data = data.replace(/\s/g, "");
  // 判断位数是否正确（一次4个地址位，就是8个字节，连头连伟13个字节，就是26个十六进制）
  if (data.length !== 26) {
    return false;
  }
  // 判断数据是否由固定的0203开始
  if (!data.startsWith('0203')) {
    return false;
  }
  // 判断CRC校验是否合格
  let raw = data.substring(0, 22);
  let crc = data.substring(22, 26);
  if (CRC.ToModbusCRC16(raw).toLowerCase() !== crc.toLowerCase()) {
    return false;
  }
  return true;
}

/**
 * 处理从蓝牙中获取到的数据，剪切掉前面的3个字节，即6位，以及后面的2个字节，即4位
 * @param data 蓝牙中获取到的数据
 * @return {string} 处理完的数据
 */
let dealWithDataFromBlueTooth = data => {
  data = data.replace(/\s/g, "");
  data = data.substring(6, 22);
  recordRaw += data;
  // store.commit('incrementReadIndex');
}

/**
 * 清空已读取的信息
 */
let clearData = () => {
  recordRaw = '';
}

export {checkDataFromBlueTooth, dealWithDataFromBlueTooth, clearData, recordRaw, readCommands, lengthCommand}
// export {checkDataFromBlueTooth, dealWithDataFromBlueTooth, interactionHexData, clearData, readCommands, lengthCommand}